library(dplyr)
library(ggplot2)
library(tidyr)
library(readr)
SFPD <- read_csv("~/Desktop/SFPD_Incidents_-_from_1_January_2003.csv", col_types = cols(Date = col_date(format = "%m/%d/%Y"), Time = col_character()))
View(SFPD)
SFPD <- SFPD [order(SFPD$Date),]
SFPD <- SFPD %>% filter(Category != 'OTHER OFFENSES')
SFPD <- SFPD %>% filter(PdDistrict != 'NA')
SFPD_1 <- SFPD %>% mutate(Year = (format(as.Date(Date, format="%d/%m/%Y"),"%Y")))
SFPD_1 <- SFPD_1 %>% mutate(Month = (format(as.Date(Date, format="%d/%m/%Y"),"%m")))
SFPD_1 <- SFPD_1 %>% mutate(Year_Month = (format(as.Date(Date, format="%d/%m/%Y"),"%Y/%m")))
SFPD_1 <- SFPD_1 %>% mutate(Hour = format(as.POSIXct(Time,format="%H:%M"),"%H"))
class(SFPD_1$Hour) = "numeric"
SFPD_1 <- SFPD_1 %>% filter(Year != 2017)
#SFPD_1 <- SFPD %>% mutate(Year = (format(as.Date(Date, format="%d/%m/%Y"),"%Y")))
p <- ggplot(SFPD_1 , aes( x = Year)) +geom_bar(stat ='count', alpha=0.8) +xlab('Year') + geom_vline(xintercept = 9, colour ='red', linetype = "dashed") + annotate("text", label = "App Launched", x = 11, y = 125000, color = "red", size= 4.3)
p + ggtitle('Crime Reportings over the years')

p1 <- ggplot(SFPD_1 , aes(x=reorder(Category, Category ,function(x)+length(x) ))) +geom_bar(stat='count') + geom_vline(xintercept = 33, color = 'red', linetype= 'dashed') + annotate("text", x = 35, y = 270000, label = "Major Crimes by Count" , color = 'red', size=7) + coord_flip() + xlab('Crime Category') + theme_grey(16)
p1 <- p1 + ggtitle('Cumulative Counts of Crimes')
p2 <- ggplot(SFPD_1 , aes( group=reorder(Category, Category ,function(x)+length(x) ),x = Year, colour= reorder(Category, Category ,function(x)+length(x) ))) +geom_path(stat ='count') +xlab('Year')+scale_colour_discrete('Category of Crime') + ggtitle('Crime Trends') + theme(legend.position="bottom") + theme_grey(16)
#p +scale_color_manual(values=palette(value=rainbow(39)))
grid.arrange(p1, p2, ncol=1)

SFPD_2 <- SFPD_1 %>% filter(Category == 'LARCENY/THEFT' |Category == 'NON-CRIMINAL' |Category == 'ASSAULT' |Category == 'VEHICLE THEFT' |Category == 'DRUG/NARCOTIC' )
library(viridis)
library(RColorBrewer)
library(gridExtra)
p1 <- ggplot(SFPD_2 , aes( group=reorder(Category, Category ,function(x)-length(x) ),x = Year, colour= reorder(Category, Category ,function(x)-length(x) ))) +geom_path(stat ='count') +xlab('Year')+scale_color_viridis('Category of Crime', discrete = T) + ylim(0,45000) + annotate("text", x = 3, y = 20000, label = "Vehicle Theft Decrease", size=2.5) + annotate("text", x = 8, y = 30000, label = "Larceny and Theft Increase", size=2.5) + annotate("text", x = 7, y = 17500, label = "Non-criminal offences increased", size=2.5)+
annotate("text", x = 7, y = 15000, label = "and drug crimes decreased", size=2.5)
p1 <- p1 + ggtitle('Major Crimes Through the Years')
p1

library(RColorBrewer)
p <- ggplot(SFPD_1 , aes( group=reorder(Category, Category ,function(x)+length(x) ),x = Year, colour= reorder(Category, Category ,function(x)+length(x) ))) +geom_path(stat ='count') +xlab('Year')+scale_colour_discrete('Category of Crime') + ggtitle('Crime Trends') + theme(legend.position="bottom")
#p +scale_color_manual(values=palette(value=rainbow(39)))
p

library(ggmap)
map_SF <- get_map("San Francisco", zoom = 12, maptype = "toner-lite", source = 'stamen')
Source : https://maps.googleapis.com/maps/api/staticmap?center=San+Francisco&zoom=12&size=640x640&scale=2&maptype=terrain
Source : https://maps.googleapis.com/maps/api/geocode/json?address=San%20Francisco
Source : http://tile.stamen.com/toner-lite/12/653/1581.png
Source : http://tile.stamen.com/toner-lite/12/654/1581.png
Source : http://tile.stamen.com/toner-lite/12/655/1581.png
Source : http://tile.stamen.com/toner-lite/12/656/1581.png
Source : http://tile.stamen.com/toner-lite/12/653/1582.png
Source : http://tile.stamen.com/toner-lite/12/654/1582.png
Source : http://tile.stamen.com/toner-lite/12/655/1582.png
Source : http://tile.stamen.com/toner-lite/12/656/1582.png
Source : http://tile.stamen.com/toner-lite/12/653/1583.png
Source : http://tile.stamen.com/toner-lite/12/654/1583.png
Source : http://tile.stamen.com/toner-lite/12/655/1583.png
Source : http://tile.stamen.com/toner-lite/12/656/1583.png
Source : http://tile.stamen.com/toner-lite/12/653/1584.png
Source : http://tile.stamen.com/toner-lite/12/654/1584.png
Source : http://tile.stamen.com/toner-lite/12/655/1584.png
Source : http://tile.stamen.com/toner-lite/12/656/1584.png
p1 <- ggmap(map_SF) + geom_point(data=SFPD_1, aes(x=X, y=Y, color= PdDistrict), alpha=0.03, size=0.01, show.legend = TRUE)+ ggtitle('Crime Report over districts') + theme_grey(15) + guides(col = guide_legend(override.aes = list(size=10)))
p2 <- ggplot(SFPD_1 , aes(x=Year)) +geom_bar(stat='count') + xlab('Year') + ylab('count of crime')+ facet_wrap(~PdDistrict) + coord_flip()
grid.arrange(p1, p2, ncol=1)

ggplot(SFPD_1 , aes(x=Year)) +geom_bar(stat='count') + xlab('Day of Week') + ylab('count of crime')+ facet_wrap(~PdDistrict) + coord_flip()

#theme(axis.text.x = element_text(angle = 90, hjust = 1))
map_SF <- get_map("San Francisco", zoom = 12, maptype = "toner-lite", source = 'stamen')
Source : https://maps.googleapis.com/maps/api/staticmap?center=San+Francisco&zoom=12&size=640x640&scale=2&maptype=terrain
Source : https://maps.googleapis.com/maps/api/geocode/json?address=San%20Francisco
Source : http://tile.stamen.com/toner-lite/12/653/1581.png
Source : http://tile.stamen.com/toner-lite/12/654/1581.png
Source : http://tile.stamen.com/toner-lite/12/655/1581.png
Source : http://tile.stamen.com/toner-lite/12/656/1581.png
Source : http://tile.stamen.com/toner-lite/12/653/1582.png
Source : http://tile.stamen.com/toner-lite/12/654/1582.png
Source : http://tile.stamen.com/toner-lite/12/655/1582.png
Source : http://tile.stamen.com/toner-lite/12/656/1582.png
Source : http://tile.stamen.com/toner-lite/12/653/1583.png
Source : http://tile.stamen.com/toner-lite/12/654/1583.png
Source : http://tile.stamen.com/toner-lite/12/655/1583.png
Source : http://tile.stamen.com/toner-lite/12/656/1583.png
Source : http://tile.stamen.com/toner-lite/12/653/1584.png
Source : http://tile.stamen.com/toner-lite/12/654/1584.png
Source : http://tile.stamen.com/toner-lite/12/655/1584.png
Source : http://tile.stamen.com/toner-lite/12/656/1584.png
ggmap(map_SF) + geom_density2d(data = SFPD_1,
aes(x = X, y = Y), size = 0.3) + stat_density2d(data = SFPD_1,
aes(x = X, y = Y, fill = ..level.., alpha = ..level..), size = 0.01,
bins = 30, geom = "polygon") + scale_fill_viridis(direction=-1) + facet_wrap(~Year) +
scale_alpha(range = c(0.2, 0.5), guide = FALSE) + ggtitle('Crime Report Density : Are Southern and Mission Districts Unsafe?') +ylab('latitude') + xlab('longitude')+ theme(legend.position="bottom") + theme_grey(25)

SFPD_drugs <- SFPD_1 %>% filter(Category=='DRUG/NARCOTIC')
p <- ggplot(SFPD_drugs , aes( group=reorder(Category,Category ,function(x)+length(x)),x = Year)) +geom_path(stat ='count') +xlab('Year') +ylim(0,13000) +ggtitle('Drugs/ Narcotics Based Felony Reported over Time')
p

p <- ggplot(SFPD_2 , aes( group= Year , x= Hour, colour=Year)) +geom_path(stat='count') +xlab('Hour of the Day') + facet_wrap(~Category) + ggtitle('Are Most Crimes Reported in the Evening?') + theme(legend.position="bottom") +scale_color_viridis(discrete = T, direction = -1)
p

p <- ggplot(SFPD_1 , aes( group= Year , x= Month, colour=Year)) +geom_path(stat='count') +xlab('Month') + ggtitle('Crime Trends over Months are Similar!') + theme(legend.position="bottom")+ ylim(0,2700) + facet_wrap(~PdDistrict)+scale_color_viridis(discrete = T, direction = -1)
p

day <- factor(SFPD_1$DayOfWeek, c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))
p <- ggplot(SFPD_1 , aes( x= day)) +geom_bar(stat='count') +xlab('Day of the week') + ggtitle('Fridays and Saturdays : Most Crime Succeptible Days') + theme(legend.position="bottom") + facet_wrap(~PdDistrict)+scale_color_viridis(discrete = T, direction = -1)+theme(axis.text.x = element_text(angle = 90, hjust = 1))
p

p <- ggplot(SFPD_drugs , aes( group= Year , x= Hour, colour=Year)) +geom_path(stat='count') +xlab('Year') + ggtitle('Time of Drug Based Crime Reportings')
p

p <- ggplot(SFPD_drugs , aes(x=reorder(Descript, Descript ,function(x)+length(x) ))) +geom_bar(stat='count') + coord_flip() + xlab('Drug Felony Type')
p + ggtitle('Major Contributors: Cocaine, Paraphernalia, Marijuana and Heroin')

day <- factor(SFPD_drugs$DayOfWeek, c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))
p1 <- ggplot(SFPD_drugs , aes(x= day)) +geom_bar(stat='count') + facet_wrap(~Year) +xlab('Day of the week') + ggtitle('Drug/ Narcotic based Crimes Surge on Wednesdays!') +theme(axis.text.x = element_text(angle = 90, hjust = 1))
p2 <- ggplot(SFPD_drugs , aes(group = Category, x= Month)) +geom_path(stat='count') + facet_wrap(~Year) + xlab('Month') + ggtitle('Drug / Narcotics based crimes Decrease after 2009')
grid.arrange(p1, p2, ncol=1)

SFPD_coke <- SFPD_drugs %>% filter(Descript == 'POSSESSION OF BASE/ROCK COCAINE'| Descript=='SALE OF BASE/ROCK COCAINE'|Descript == 'POSSESSION OF BASE/ROCK COCAINE FOR SALE' )
SFPD_coke$Type = 'cocaine'
#View(SFPD_coke)
SFPD_heroin <- SFPD_drugs %>% filter(Descript == 'POSSESSION OF HEROIN'| Descript=='SALE OF HEROIN'|Descript == 'POSSESSION OF HEROIN FOR SALES' )
SFPD_heroin$Type = 'heroin'
#View(SFPD_heroin)
SFPD_mari <- SFPD_drugs %>% filter(Descript == 'POSSESSION OF MARIJUANA'| Descript=='SALE OF MARIJUANA'|Descript == 'POSSESSION OF MARIJUANA FOR SALES' )
SFPD_mari$Type = 'marijuana'
#View(SFPD_mari)
SFPD_np <- SFPD_drugs %>% filter(Descript == 'POSSESSION OF NARCOTICS PARAPHERNALIA'| Descript=='SALE OF NARCOTICS PARAPHERNALIA'|Descript == 'POSSESSION OF NARCOTICS PARAPHERNALIA FOR SALES' )
SFPD_np$Type = 'narcotics'
SFPD_drugs_subset = rbind(SFPD_coke, SFPD_np, SFPD_mari, SFPD_heroin)
#View(SFPD_drugs_subset)
p1 <- ggplot() + geom_path(data= SFPD_drugs, aes( group=reorder(Category,Category ,function(x)+length(x)),x = Year), stat ='count', alpha=0.6)
p2 <- p1 +geom_path(data = SFPD_drugs_subset, aes(group = Type, x=Year, colour=Type), stat = 'count', size=1.01) + theme(legend.position="bottom") + geom_vline(xintercept = 3 , linetype='dashed', alpha=0.5) + annotate("text", x = 4, y = 7500, label = "Drugs Became Cheaper", size=2.5, color='Blue') + geom_vline(xintercept = 6 , linetype='dashed', alpha=0.5) + annotate("text", x = 7, y = 12000, label = "Recession Hits US", size=2.5, color='Blue') + geom_vline(xintercept = 9 , linetype='dashed', alpha=0.5) + annotate("text", x = 10, y = 8000, label = "Silk Road Launched", size=2.5, color='Blue')+ geom_vline(xintercept = 11 , linetype='dashed', alpha=0.5) + annotate("text", x = 12, y = 3000, label = "Shut Down by FBI", size=2.5, color='Blue')
p2+ ggtitle('Drug / Narcotic Crimes Timeline')

NA
p1 <- ggplot(SFPD_drugs , aes(x=reorder(PdDistrict, PdDistrict ,function(x)+length(x) ))) +geom_bar(stat='count') + facet_wrap(~Year) +xlab('District') + ggtitle('Drug/ Narcotic based Crimes Distribution over Districts') +theme(axis.text.x = element_text(angle = 90, hjust = 1))
#p1
p2 <- ggplot(SFPD_drugs_subset , aes(group = Type , x = Year, color = Type)) +geom_path(stat='count') + facet_wrap(~PdDistrict) + xlab('Year') + ggtitle('Different drugs over Years and Districts') + theme(legend.position="bottom")+theme(axis.text.x = element_text(angle = 90, hjust = 1))
grid.arrange(p1, p2, ncol=1)

library(ggmap)
mapSF_zoom <- get_map(location = c(lon=mean(SFPD_drugs$X),lat=mean(SFPD_drugs$Y)), zoom = 15, maptype = "roadmap", scale = 2)
Source : https://maps.googleapis.com/maps/api/staticmap?center=37.774191,-122.417589&zoom=15&size=640x640&scale=2&maptype=roadmap&language=en-EN
mapSF <- get_map(location = 'San Francisco', zoom = 13, maptype = "roadmap", scale = 2)
Source : https://maps.googleapis.com/maps/api/staticmap?center=San+Francisco&zoom=13&size=640x640&scale=2&maptype=roadmap&language=en-EN
Source : https://maps.googleapis.com/maps/api/geocode/json?address=San%20Francisco
# plotting the map with some points on it
ggmap(mapSF) + geom_density2d(data = SFPD_drugs,
aes(x = X, y = Y), size = 0.3) + stat_density2d(data = SFPD_drugs,
aes(x = X, y = Y, fill = ..level.., alpha = ..level..), size = 0.01,
bins = 30, geom = "polygon") + scale_fill_viridis(direction=-1) +
scale_alpha(range = c(0.1, 0.4), guide = FALSE) + ggtitle('Drug Related Crime Density')+theme(legend.position="bottom")

ggmap(mapSF_zoom) + geom_density2d(data = SFPD_drugs,
aes(x = X, y = Y), size = 0.3) + stat_density2d(data = SFPD_drugs,
aes(x = X, y = Y, fill = ..level.., alpha = ..level..), size = 0.01,
bins = 30, geom = "polygon") + scale_fill_viridis(direction=-1) +
scale_alpha(range = c(0.1, 0.4), guide = FALSE) + ggtitle('Market Street and Mission Street : Drug Hubs ')

NA
library(ggmap)
#mapSF_1 <- get_map(location = 'San Francisco', zoom = 13, maptype = "roadmap", scale = 2)
# plotting the map with some points on it
ggmap(mapSF) + geom_density2d(data = SFPD_drugs_subset,
aes(x = X, y = Y), size = 0.3) + stat_density2d(data = SFPD_drugs,
aes(x = X, y = Y, fill = ..level.., alpha = ..level..), size = 0.01,
bins = 30, geom = "polygon") + scale_fill_viridis(direction=-1) + facet_wrap(~Type)+
scale_alpha(range = c(0.1, 0.4), guide = FALSE) + ggtitle('Drug Type Related Crime Density')+theme(legend.position="bottom")

LS0tCnRpdGxlOiAiRFJVRyByZWxhdGVkIGNyaW1lIGFuYWx5c2lzIEFuYWx5c2lzIFNGUEQiCmF1dGhvcjogIlZpYmh1dGkgTWFoYWphbiAodm0yNDg2KSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKCgpgYGB7ciwgcmVzdWx0cz0naGlkZScsIHdhcm5pbmc9J2hpZGUnfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkocmVhZHIpCmBgYAoKYGBge3IscmVzdWx0cz0naGlkZScsIHdhcm5pbmc9J2hpZGUnfQpTRlBEIDwtIHJlYWRfY3N2KCJ+L0Rlc2t0b3AvU0ZQRF9JbmNpZGVudHNfLV9mcm9tXzFfSmFudWFyeV8yMDAzLmNzdiIsIGNvbF90eXBlcyA9IGNvbHMoRGF0ZSA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlbS8lZC8lWSIpLCBUaW1lID0gY29sX2NoYXJhY3RlcigpKSkKCmBgYAoKYGBge3J9ClZpZXcoU0ZQRCkKYGBgCgpgYGB7cn0KU0ZQRCA8LSBTRlBEIFtvcmRlcihTRlBEJERhdGUpLF0KU0ZQRCA8LSBTRlBEICU+JSBmaWx0ZXIoQ2F0ZWdvcnkgIT0gJ09USEVSIE9GRkVOU0VTJykKU0ZQRCA8LSBTRlBEICU+JSBmaWx0ZXIoUGREaXN0cmljdCAhPSAnTkEnKQpTRlBEXzEgPC0gU0ZQRCAlPiUgbXV0YXRlKFllYXIgPSAoZm9ybWF0KGFzLkRhdGUoRGF0ZSwgZm9ybWF0PSIlZC8lbS8lWSIpLCIlWSIpKSkKU0ZQRF8xIDwtIFNGUERfMSAlPiUgbXV0YXRlKE1vbnRoID0gKGZvcm1hdChhcy5EYXRlKERhdGUsIGZvcm1hdD0iJWQvJW0vJVkiKSwiJW0iKSkpClNGUERfMSA8LSBTRlBEXzEgJT4lIG11dGF0ZShZZWFyX01vbnRoID0gKGZvcm1hdChhcy5EYXRlKERhdGUsIGZvcm1hdD0iJWQvJW0vJVkiKSwiJVkvJW0iKSkpClNGUERfMSA8LSBTRlBEXzEgJT4lIG11dGF0ZShIb3VyID0gZm9ybWF0KGFzLlBPU0lYY3QoVGltZSxmb3JtYXQ9IiVIOiVNIiksIiVIIikpCmNsYXNzKFNGUERfMSRIb3VyKSA9ICJudW1lcmljIgpTRlBEXzEgPC0gU0ZQRF8xICU+JSBmaWx0ZXIoWWVhciAhPSAyMDE3KQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01fQojU0ZQRF8xIDwtIFNGUEQgJT4lIG11dGF0ZShZZWFyID0gKGZvcm1hdChhcy5EYXRlKERhdGUsIGZvcm1hdD0iJWQvJW0vJVkiKSwiJVkiKSkpCnAgPC0gZ2dwbG90KFNGUERfMSAsIGFlcyggeCA9IFllYXIpKSArZ2VvbV9iYXIoc3RhdCA9J2NvdW50JywgYWxwaGE9MC44KSAgK3hsYWIoJ1llYXInKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDksIGNvbG91ciA9J3JlZCcsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgYW5ub3RhdGUoInRleHQiLCBsYWJlbCA9ICJBcHAgTGF1bmNoZWQiLCB4ID0gMTEsIHkgPSAxMjUwMDAsIGNvbG9yID0gInJlZCIsIHNpemU9IDQuMykKcCArIGdndGl0bGUoJ0NyaW1lIFJlcG9ydGluZ3Mgb3ZlciB0aGUgeWVhcnMnKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD0xNX0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMgRmlnIDIuMyAjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnAxIDwtIGdncGxvdChTRlBEXzEgLCBhZXMoeD1yZW9yZGVyKENhdGVnb3J5LCBDYXRlZ29yeSAsZnVuY3Rpb24oeCkrbGVuZ3RoKHgpICkpKSArZ2VvbV9iYXIoc3RhdD0nY291bnQnKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDMzLCBjb2xvciA9ICdyZWQnLCBsaW5ldHlwZT0gJ2Rhc2hlZCcpICsgYW5ub3RhdGUoInRleHQiLCB4ID0gMzUsIHkgPSAyNzAwMDAsIGxhYmVsID0gIk1ham9yIENyaW1lcyBieSBDb3VudCIgLCBjb2xvciA9ICdyZWQnLCBzaXplPTcpICsgY29vcmRfZmxpcCgpICsgeGxhYignQ3JpbWUgQ2F0ZWdvcnknKSArIHRoZW1lX2dyZXkoMTYpCnAxIDwtIHAxICsgZ2d0aXRsZSgnQ3VtdWxhdGl2ZSBDb3VudHMgb2YgQ3JpbWVzJykgCnAyIDwtIGdncGxvdChTRlBEXzEgLCBhZXMoIGdyb3VwPXJlb3JkZXIoQ2F0ZWdvcnksIENhdGVnb3J5ICxmdW5jdGlvbih4KStsZW5ndGgoeCkgKSx4ID0gWWVhciwgY29sb3VyPSByZW9yZGVyKENhdGVnb3J5LCBDYXRlZ29yeSAsZnVuY3Rpb24oeCkrbGVuZ3RoKHgpICkpKSArZ2VvbV9wYXRoKHN0YXQgPSdjb3VudCcpICAreGxhYignWWVhcicpK3NjYWxlX2NvbG91cl9kaXNjcmV0ZSgnQ2F0ZWdvcnkgb2YgQ3JpbWUnKSArIGdndGl0bGUoJ0NyaW1lIFRyZW5kcycpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArIHRoZW1lX2dyZXkoMTYpCiNwICtzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXBhbGV0dGUodmFsdWU9cmFpbmJvdygzOSkpKSAKZ3JpZC5hcnJhbmdlKHAxLCBwMiwgbmNvbD0xKQpgYGAKCmBgYHtyfQpTRlBEXzIgPC0gU0ZQRF8xICU+JSBmaWx0ZXIoQ2F0ZWdvcnkgPT0gJ0xBUkNFTlkvVEhFRlQnIHxDYXRlZ29yeSA9PSAnTk9OLUNSSU1JTkFMJyB8Q2F0ZWdvcnkgPT0gJ0FTU0FVTFQnIHxDYXRlZ29yeSA9PSAnVkVISUNMRSBUSEVGVCcgfENhdGVnb3J5ID09ICdEUlVHL05BUkNPVElDJyAgKQpgYGAKCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIEZpZyAyLjEgIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KGdyaWRFeHRyYSkKcDEgPC0gZ2dwbG90KFNGUERfMiAsIGFlcyggZ3JvdXA9cmVvcmRlcihDYXRlZ29yeSwgQ2F0ZWdvcnkgLGZ1bmN0aW9uKHgpLWxlbmd0aCh4KSApLHggPSBZZWFyLCBjb2xvdXI9IHJlb3JkZXIoQ2F0ZWdvcnksIENhdGVnb3J5ICxmdW5jdGlvbih4KS1sZW5ndGgoeCkgKSkpICtnZW9tX3BhdGgoc3RhdCA9J2NvdW50JykgICt4bGFiKCdZZWFyJykrc2NhbGVfY29sb3JfdmlyaWRpcygnQ2F0ZWdvcnkgb2YgQ3JpbWUnLCBkaXNjcmV0ZSA9IFQpICsgeWxpbSgwLDQ1MDAwKSArIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDMsIHkgPSAyMDAwMCwgbGFiZWwgPSAiVmVoaWNsZSBUaGVmdCBEZWNyZWFzZSIsIHNpemU9Mi41KSArIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDgsIHkgPSAzMDAwMCwgbGFiZWwgPSAiTGFyY2VueSBhbmQgVGhlZnQgSW5jcmVhc2UiLCBzaXplPTIuNSkgKyBhbm5vdGF0ZSgidGV4dCIsIHggPSA3LCB5ID0gMTc1MDAsIGxhYmVsID0gIk5vbi1jcmltaW5hbCBvZmZlbmNlcyBpbmNyZWFzZWQiLCBzaXplPTIuNSkrCmFubm90YXRlKCJ0ZXh0IiwgeCA9IDcsIHkgPSAxNTAwMCwgbGFiZWwgPSAiYW5kIGRydWcgY3JpbWVzIGRlY3JlYXNlZCIsIHNpemU9Mi41KQoKcDEgPC0gcDEgKyBnZ3RpdGxlKCdNYWpvciBDcmltZXMgVGhyb3VnaCB0aGUgWWVhcnMnKQpwMQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KbGlicmFyeShSQ29sb3JCcmV3ZXIpCnAgPC0gZ2dwbG90KFNGUERfMSAsIGFlcyggZ3JvdXA9cmVvcmRlcihDYXRlZ29yeSwgQ2F0ZWdvcnkgLGZ1bmN0aW9uKHgpK2xlbmd0aCh4KSApLHggPSBZZWFyLCBjb2xvdXI9IHJlb3JkZXIoQ2F0ZWdvcnksIENhdGVnb3J5ICxmdW5jdGlvbih4KStsZW5ndGgoeCkgKSkpICtnZW9tX3BhdGgoc3RhdCA9J2NvdW50JykgICt4bGFiKCdZZWFyJykrc2NhbGVfY29sb3VyX2Rpc2NyZXRlKCdDYXRlZ29yeSBvZiBDcmltZScpICsgZ2d0aXRsZSgnQ3JpbWUgVHJlbmRzJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpCiNwICtzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXBhbGV0dGUodmFsdWU9cmFpbmJvdygzOSkpKSAKcApgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTE1LCBmaWcud2lkdGg9MTB9CmxpYnJhcnkoZ2dtYXApCm1hcF9TRiA8LSBnZXRfbWFwKCJTYW4gRnJhbmNpc2NvIiwgem9vbSA9IDEyLCBtYXB0eXBlID0gInRvbmVyLWxpdGUiLCBzb3VyY2UgPSAnc3RhbWVuJykKcDEgPC0gZ2dtYXAobWFwX1NGKSArIGdlb21fcG9pbnQoZGF0YT1TRlBEXzEsIGFlcyh4PVgsIHk9WSwgY29sb3I9IFBkRGlzdHJpY3QpLCBhbHBoYT0wLjAzLCBzaXplPTAuMDEsIHNob3cubGVnZW5kID0gVFJVRSkrIGdndGl0bGUoJ0NyaW1lIFJlcG9ydCBvdmVyIGRpc3RyaWN0cycpICsgdGhlbWVfZ3JleSgxNSkgKyBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT0xMCkpKQpwMiA8LSBnZ3Bsb3QoU0ZQRF8xICwgYWVzKHg9WWVhcikpICtnZW9tX2JhcihzdGF0PSdjb3VudCcpICArIHhsYWIoJ1llYXInKSArIHlsYWIoJ2NvdW50IG9mIGNyaW1lJykrIGZhY2V0X3dyYXAoflBkRGlzdHJpY3QpICsgY29vcmRfZmxpcCgpIApncmlkLmFycmFuZ2UocDEsIHAyLCBuY29sPTEpCmBgYApgYGB7ciwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OH0KZ2dwbG90KFNGUERfMSAsIGFlcyh4PVllYXIpKSArZ2VvbV9iYXIoc3RhdD0nY291bnQnKSAgKyB4bGFiKCdZZWFyJykgKyB5bGFiKCdjb3VudCBvZiBjcmltZScpKyBmYWNldF93cmFwKH5QZERpc3RyaWN0KSArIGNvb3JkX2ZsaXAoKQogICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTIwLCBmaWcud2lkdGg9MjB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIEZpZyAyLjIgIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwptYXBfU0YgPC0gZ2V0X21hcCgiU2FuIEZyYW5jaXNjbyIsIHpvb20gPSAxMiwgbWFwdHlwZSA9ICJ0b25lci1saXRlIiwgc291cmNlID0gJ3N0YW1lbicpCmdnbWFwKG1hcF9TRikgKyAgIGdlb21fZGVuc2l0eTJkKGRhdGEgPSBTRlBEXzEsIAogICAgYWVzKHggPSBYLCB5ID0gWSksIHNpemUgPSAwLjMpICsgc3RhdF9kZW5zaXR5MmQoZGF0YSA9IFNGUERfMSwgCiAgICBhZXMoeCA9IFgsIHkgPSBZLCBmaWxsID0gLi5sZXZlbC4uLCBhbHBoYSA9IC4ubGV2ZWwuLiksIHNpemUgPSAwLjAxLCAKICAgIGJpbnMgPSAzMCwgZ2VvbSA9ICJwb2x5Z29uIikgKyBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uPS0xKSArIGZhY2V0X3dyYXAoflllYXIpICsKICAgIHNjYWxlX2FscGhhKHJhbmdlID0gYygwLjIsIDAuNSksIGd1aWRlID0gRkFMU0UpICsgZ2d0aXRsZSgnQ3JpbWUgUmVwb3J0IERlbnNpdHkgOiBBcmUgU291dGhlcm4gYW5kIE1pc3Npb24gRGlzdHJpY3RzIFVuc2FmZT8nKSAreWxhYignbGF0aXR1ZGUnKSArIHhsYWIoJ2xvbmdpdHVkZScpKyB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsgdGhlbWVfZ3JleSgyNSkKYGBgCgpgYGB7cn0KU0ZQRF9kcnVncyA8LSBTRlBEXzEgJT4lIGZpbHRlcihDYXRlZ29yeT09J0RSVUcvTkFSQ09USUMnKQoKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQpwIDwtIGdncGxvdChTRlBEX2RydWdzICwgYWVzKCBncm91cD1yZW9yZGVyKENhdGVnb3J5LENhdGVnb3J5ICxmdW5jdGlvbih4KStsZW5ndGgoeCkpLHggPSBZZWFyKSkgK2dlb21fcGF0aChzdGF0ID0nY291bnQnKSAgK3hsYWIoJ1llYXInKSAreWxpbSgwLDEzMDAwKSArZ2d0aXRsZSgnRHJ1Z3MvIE5hcmNvdGljcyBCYXNlZCBGZWxvbnkgUmVwb3J0ZWQgb3ZlciBUaW1lJykKcApgYGAKYGBge3IsZmlnLmhlaWdodD01LCBmaWcud2lkdGg9N30KIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyBGaWcgMi40ICMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnAgPC0gZ2dwbG90KFNGUERfMiAsIGFlcyggZ3JvdXA9IFllYXIgLCB4PSBIb3VyLCBjb2xvdXI9WWVhcikpICtnZW9tX3BhdGgoc3RhdD0nY291bnQnKSAgK3hsYWIoJ0hvdXIgb2YgdGhlIERheScpICsgZmFjZXRfd3JhcCh+Q2F0ZWdvcnkpICsgZ2d0aXRsZSgnQXJlIE1vc3QgQ3JpbWVzIFJlcG9ydGVkIGluIHRoZSBFdmVuaW5nPycpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFQsIGRpcmVjdGlvbiA9IC0xKSAKcCAKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTh9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIEZpZyAyLjUgIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwpwIDwtIGdncGxvdChTRlBEXzEgLCBhZXMoIGdyb3VwPSBZZWFyICwgeD0gTW9udGgsIGNvbG91cj1ZZWFyKSkgK2dlb21fcGF0aChzdGF0PSdjb3VudCcpICAreGxhYignTW9udGgnKSArICBnZ3RpdGxlKCdDcmltZSBUcmVuZHMgb3ZlciBNb250aHMgYXJlIFNpbWlsYXIhJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpKyB5bGltKDAsMjcwMCkgKyBmYWNldF93cmFwKH5QZERpc3RyaWN0KStzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVCwgZGlyZWN0aW9uID0gLTEpCnAgCmBgYAoKYGBge3IsZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OH0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyBGaWcgMi42ICMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGF5IDwtIGZhY3RvcihTRlBEXzEkRGF5T2ZXZWVrLCBjKCJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5IiwgIlN1bmRheSIpKQpwIDwtIGdncGxvdChTRlBEXzEgLCBhZXMoICB4PSBkYXkpKSArZ2VvbV9iYXIoc3RhdD0nY291bnQnKSAgK3hsYWIoJ0RheSBvZiB0aGUgd2VlaycpICsgIGdndGl0bGUoJ0ZyaWRheXMgYW5kIFNhdHVyZGF5cyA6IE1vc3QgQ3JpbWUgU3VjY2VwdGlibGUgRGF5cycpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArIGZhY2V0X3dyYXAoflBkRGlzdHJpY3QpK3NjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBULCBkaXJlY3Rpb24gPSAtMSkrdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkgIApwIApgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9CgoKcCA8LSBnZ3Bsb3QoU0ZQRF9kcnVncyAsIGFlcyggZ3JvdXA9IFllYXIgLCB4PSBIb3VyLCBjb2xvdXI9WWVhcikpICtnZW9tX3BhdGgoc3RhdD0nY291bnQnKSAgK3hsYWIoJ1llYXInKSArIGdndGl0bGUoJ1RpbWUgb2YgRHJ1ZyBCYXNlZCBDcmltZSBSZXBvcnRpbmdzJykgCnAgCmBgYApgYGB7cixmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD0xMH0KcCA8LSBnZ3Bsb3QoU0ZQRF9kcnVncyAsIGFlcyh4PXJlb3JkZXIoRGVzY3JpcHQsIERlc2NyaXB0ICxmdW5jdGlvbih4KStsZW5ndGgoeCkgKSkpICtnZW9tX2JhcihzdGF0PSdjb3VudCcpICsgY29vcmRfZmxpcCgpICsgeGxhYignRHJ1ZyBGZWxvbnkgVHlwZScpCnAgKyBnZ3RpdGxlKCdNYWpvciBDb250cmlidXRvcnM6IENvY2FpbmUsIFBhcmFwaGVybmFsaWEsIE1hcmlqdWFuYSBhbmQgSGVyb2luJykKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTE1LCBmaWcud2lkdGg9MTB9CmRheSA8LSBmYWN0b3IoU0ZQRF9kcnVncyREYXlPZldlZWssIGMoIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiLCAiU3VuZGF5IikpCnAxIDwtIGdncGxvdChTRlBEX2RydWdzICwgYWVzKHg9IGRheSkpICtnZW9tX2JhcihzdGF0PSdjb3VudCcpICsgZmFjZXRfd3JhcCh+WWVhcikgICt4bGFiKCdEYXkgb2YgdGhlIHdlZWsnKSArICBnZ3RpdGxlKCdEcnVnLyBOYXJjb3RpYyBiYXNlZCBDcmltZXMgU3VyZ2Ugb24gV2VkbmVzZGF5cyEnKSArdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKcDIgPC0gZ2dwbG90KFNGUERfZHJ1Z3MgLCBhZXMoZ3JvdXAgPSBDYXRlZ29yeSwgeD0gTW9udGgpKSArZ2VvbV9wYXRoKHN0YXQ9J2NvdW50JykgICsgZmFjZXRfd3JhcCh+WWVhcikgKyB4bGFiKCdNb250aCcpICsgIGdndGl0bGUoJ0RydWcgLyBOYXJjb3RpY3MgYmFzZWQgY3JpbWVzIERlY3JlYXNlIGFmdGVyIDIwMDknKSAKZ3JpZC5hcnJhbmdlKHAxLCBwMiwgbmNvbD0xKQpgYGAKCmBgYHtyfQpTRlBEX2Nva2UgPC0gU0ZQRF9kcnVncyAlPiUgZmlsdGVyKERlc2NyaXB0ID09ICdQT1NTRVNTSU9OIE9GIEJBU0UvUk9DSyBDT0NBSU5FJ3wgRGVzY3JpcHQ9PSdTQUxFIE9GIEJBU0UvUk9DSyBDT0NBSU5FJ3xEZXNjcmlwdCA9PSAnUE9TU0VTU0lPTiBPRiBCQVNFL1JPQ0sgQ09DQUlORSBGT1IgU0FMRScgKQpTRlBEX2Nva2UkVHlwZSA9ICdjb2NhaW5lJwojVmlldyhTRlBEX2Nva2UpCgoKU0ZQRF9oZXJvaW4gPC0gU0ZQRF9kcnVncyAlPiUgZmlsdGVyKERlc2NyaXB0ID09ICdQT1NTRVNTSU9OIE9GIEhFUk9JTid8IERlc2NyaXB0PT0nU0FMRSBPRiBIRVJPSU4nfERlc2NyaXB0ID09ICdQT1NTRVNTSU9OIE9GIEhFUk9JTiBGT1IgU0FMRVMnICkKU0ZQRF9oZXJvaW4kVHlwZSA9ICdoZXJvaW4nCiNWaWV3KFNGUERfaGVyb2luKQoKU0ZQRF9tYXJpIDwtIFNGUERfZHJ1Z3MgJT4lIGZpbHRlcihEZXNjcmlwdCA9PSAnUE9TU0VTU0lPTiBPRiBNQVJJSlVBTkEnfCBEZXNjcmlwdD09J1NBTEUgT0YgTUFSSUpVQU5BJ3xEZXNjcmlwdCA9PSAnUE9TU0VTU0lPTiBPRiBNQVJJSlVBTkEgRk9SIFNBTEVTJyApClNGUERfbWFyaSRUeXBlID0gJ21hcmlqdWFuYScKI1ZpZXcoU0ZQRF9tYXJpKQpTRlBEX25wIDwtIFNGUERfZHJ1Z3MgJT4lIGZpbHRlcihEZXNjcmlwdCA9PSAnUE9TU0VTU0lPTiBPRiBOQVJDT1RJQ1MgUEFSQVBIRVJOQUxJQSd8IERlc2NyaXB0PT0nU0FMRSBPRiBOQVJDT1RJQ1MgUEFSQVBIRVJOQUxJQSd8RGVzY3JpcHQgPT0gJ1BPU1NFU1NJT04gT0YgTkFSQ09USUNTIFBBUkFQSEVSTkFMSUEgRk9SIFNBTEVTJyApClNGUERfbnAkVHlwZSA9ICduYXJjb3RpY3MnClNGUERfZHJ1Z3Nfc3Vic2V0ID0gcmJpbmQoU0ZQRF9jb2tlLCBTRlBEX25wLCBTRlBEX21hcmksIFNGUERfaGVyb2luKQojVmlldyhTRlBEX2RydWdzX3N1YnNldCkKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9CgpwMSA8LSBnZ3Bsb3QoKSArIGdlb21fcGF0aChkYXRhPSBTRlBEX2RydWdzLCBhZXMoIGdyb3VwPXJlb3JkZXIoQ2F0ZWdvcnksQ2F0ZWdvcnkgLGZ1bmN0aW9uKHgpK2xlbmd0aCh4KSkseCA9IFllYXIpLCBzdGF0ID0nY291bnQnLCBhbHBoYT0wLjYpCnAyIDwtIHAxICtnZW9tX3BhdGgoZGF0YSA9IFNGUERfZHJ1Z3Nfc3Vic2V0LCBhZXMoZ3JvdXAgPSBUeXBlLCB4PVllYXIsIGNvbG91cj1UeXBlKSwgc3RhdCA9ICdjb3VudCcsIHNpemU9MS4wMSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMyAsIGxpbmV0eXBlPSdkYXNoZWQnLCBhbHBoYT0wLjUpICsgYW5ub3RhdGUoInRleHQiLCB4ID0gNCwgeSA9IDc1MDAsIGxhYmVsID0gIkRydWdzIEJlY2FtZSBDaGVhcGVyIiwgc2l6ZT0yLjUsICBjb2xvcj0nQmx1ZScpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNiAsIGxpbmV0eXBlPSdkYXNoZWQnLCBhbHBoYT0wLjUpICsgYW5ub3RhdGUoInRleHQiLCB4ID0gNywgeSA9IDEyMDAwLCBsYWJlbCA9ICJSZWNlc3Npb24gSGl0cyBVUyIsIHNpemU9Mi41LCAgY29sb3I9J0JsdWUnKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDkgLCBsaW5ldHlwZT0nZGFzaGVkJywgYWxwaGE9MC41KSArIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDEwLCB5ID0gODAwMCwgbGFiZWwgPSAiU2lsayBSb2FkIExhdW5jaGVkIiwgc2l6ZT0yLjUsICBjb2xvcj0nQmx1ZScpKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMSAsIGxpbmV0eXBlPSdkYXNoZWQnLCBhbHBoYT0wLjUpICsgYW5ub3RhdGUoInRleHQiLCB4ID0gMTIsIHkgPSAzMDAwLCBsYWJlbCA9ICJTaHV0IERvd24gYnkgRkJJIiwgc2l6ZT0yLjUsICBjb2xvcj0nQmx1ZScpCgpwMisgZ2d0aXRsZSgnRHJ1ZyAvIE5hcmNvdGljIENyaW1lcyBUaW1lbGluZScpIAogCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD04fQpwMSA8LSBnZ3Bsb3QoU0ZQRF9kcnVncyAsIGFlcyh4PXJlb3JkZXIoUGREaXN0cmljdCwgUGREaXN0cmljdCAsZnVuY3Rpb24oeCkrbGVuZ3RoKHgpICkpKSArZ2VvbV9iYXIoc3RhdD0nY291bnQnKSArIGZhY2V0X3dyYXAoflllYXIpICAreGxhYignRGlzdHJpY3QnKSArICBnZ3RpdGxlKCdEcnVnLyBOYXJjb3RpYyBiYXNlZCBDcmltZXMgRGlzdHJpYnV0aW9uIG92ZXIgRGlzdHJpY3RzJykgK3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCiNwMQpwMiA8LSBnZ3Bsb3QoU0ZQRF9kcnVnc19zdWJzZXQgLCBhZXMoZ3JvdXAgPSBUeXBlICwgeCA9IFllYXIsIGNvbG9yID0gVHlwZSkpICtnZW9tX3BhdGgoc3RhdD0nY291bnQnKSAgKyBmYWNldF93cmFwKH5QZERpc3RyaWN0KSArIHhsYWIoJ1llYXInKSArICBnZ3RpdGxlKCdEaWZmZXJlbnQgZHJ1Z3Mgb3ZlciBZZWFycyBhbmQgRGlzdHJpY3RzJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpK3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCgpncmlkLmFycmFuZ2UocDEsIHAyLCBuY29sPTEpCmBgYAoKCgoKYGBge3IsIGZpZy5oZWlnaHQ9NSxmaWcud2lkdGg9N30KCmxpYnJhcnkoZ2dtYXApCm1hcFNGX3pvb20gPC0gZ2V0X21hcChsb2NhdGlvbiA9IGMobG9uPW1lYW4oU0ZQRF9kcnVncyRYKSxsYXQ9bWVhbihTRlBEX2RydWdzJFkpKSwgem9vbSA9IDE1LCBtYXB0eXBlID0gInJvYWRtYXAiLCBzY2FsZSA9IDIpCm1hcFNGIDwtIGdldF9tYXAobG9jYXRpb24gPSAnU2FuIEZyYW5jaXNjbycsIHpvb20gPSAxMywgbWFwdHlwZSA9ICJyb2FkbWFwIiwgc2NhbGUgPSAyKQoKIyBwbG90dGluZyB0aGUgbWFwIHdpdGggc29tZSBwb2ludHMgb24gaXQKZ2dtYXAobWFwU0YpICsgZ2VvbV9kZW5zaXR5MmQoZGF0YSA9IFNGUERfZHJ1Z3MsIAogICAgYWVzKHggPSBYLCB5ID0gWSksIHNpemUgPSAwLjMpICsgc3RhdF9kZW5zaXR5MmQoZGF0YSA9IFNGUERfZHJ1Z3MsIAogICAgYWVzKHggPSBYLCB5ID0gWSwgZmlsbCA9IC4ubGV2ZWwuLiwgYWxwaGEgPSAuLmxldmVsLi4pLCBzaXplID0gMC4wMSwgCiAgICBiaW5zID0gMzAsIGdlb20gPSAicG9seWdvbiIpICsgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbj0tMSkgKyAKICAgIHNjYWxlX2FscGhhKHJhbmdlID0gYygwLjEsIDAuNCksIGd1aWRlID0gRkFMU0UpICsgZ2d0aXRsZSgnRHJ1ZyBSZWxhdGVkIENyaW1lIERlbnNpdHknKSt0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpCgpnZ21hcChtYXBTRl96b29tKSArIGdlb21fZGVuc2l0eTJkKGRhdGEgPSBTRlBEX2RydWdzLCAKICAgIGFlcyh4ID0gWCwgeSA9IFkpLCBzaXplID0gMC4zKSArIHN0YXRfZGVuc2l0eTJkKGRhdGEgPSBTRlBEX2RydWdzLCAKICAgIGFlcyh4ID0gWCwgeSA9IFksIGZpbGwgPSAuLmxldmVsLi4sIGFscGhhID0gLi5sZXZlbC4uKSwgc2l6ZSA9IDAuMDEsIAogICAgYmlucyA9IDMwLCBnZW9tID0gInBvbHlnb24iKSArIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXJlY3Rpb249LTEpICsgCiAgICBzY2FsZV9hbHBoYShyYW5nZSA9IGMoMC4xLCAwLjQpLCBndWlkZSA9IEZBTFNFKSArIGdndGl0bGUoJ01hcmtldCBTdHJlZXQgYW5kIE1pc3Npb24gU3RyZWV0IDogRHJ1ZyBIdWJzICcpCiAgCgpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MTB9CmxpYnJhcnkoZ2dtYXApCgojbWFwU0ZfMSA8LSBnZXRfbWFwKGxvY2F0aW9uID0gJ1NhbiBGcmFuY2lzY28nLCB6b29tID0gMTMsIG1hcHR5cGUgPSAicm9hZG1hcCIsIHNjYWxlID0gMikKCiMgcGxvdHRpbmcgdGhlIG1hcCB3aXRoIHNvbWUgcG9pbnRzIG9uIGl0CmdnbWFwKG1hcFNGKSArIGdlb21fZGVuc2l0eTJkKGRhdGEgPSBTRlBEX2RydWdzX3N1YnNldCwgCiAgICBhZXMoeCA9IFgsIHkgPSBZKSwgc2l6ZSA9IDAuMykgKyBzdGF0X2RlbnNpdHkyZChkYXRhID0gU0ZQRF9kcnVncywgCiAgICBhZXMoeCA9IFgsIHkgPSBZLCBmaWxsID0gLi5sZXZlbC4uLCBhbHBoYSA9IC4ubGV2ZWwuLiksIHNpemUgPSAwLjAxLCAKICAgIGJpbnMgPSAzMCwgZ2VvbSA9ICJwb2x5Z29uIikgKyBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uPS0xKSArIGZhY2V0X3dyYXAoflR5cGUpKwogICAgc2NhbGVfYWxwaGEocmFuZ2UgPSBjKDAuMSwgMC40KSwgZ3VpZGUgPSBGQUxTRSkgKyBnZ3RpdGxlKCdEcnVnIFR5cGUgUmVsYXRlZCBDcmltZSBEZW5zaXR5JykrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQoKCmBgYAoKCgo=